import java.io.File;
import java.lang.reflect.*;

public class one {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException {
//        test t = new test("wc");
////        Class ct = Class.forName("test");
//        Class ct = t.getClass();
//
//        Constructor[] constructors = ct.getDeclaredConstructors();
//
//        for (Constructor c : constructors) {
//            String name = c.getName();
//            Parameter[] parameters = c.getParameters();
//            System.out.println(name + " " + parameters.length);
//            for (Parameter parameter : parameters) {
//                System.out.println(parameter.getParameterizedType() + " " + parameter.getName());
//            }
//        }
//
//        Constructor constructor = ct.getConstructor(String.class);
//        test tt = (test) constructor.newInstance("WCCCC");
//        tt.print();
//
//        System.out.println("===============");
//
//        Field[] fields = ct.getFields();
//
//        for (Field f : fields) {
//            System.out.println(f.getType() + " " + f.getName());
//        }
//        System.out.println("===============");
//
//        Field[] all_fields = ct.getDeclaredFields();
//        for (Field f : all_fields) {
//            System.out.println(f.getType() + " " + f.getName());
//        }
//
//        System.out.println("===============");
//
//
//        Field field = ct.getField("_public");
//        field.set(t, "Wcccc");
//
//        Field field1 = ct.getDeclaredField("a");
//        field1.setAccessible(true);
//        field1.set(t, 5);
//
//        System.out.println(t.getA() + " " + t.get_public());
//


        test test1 = new test("wccc");
        test1.setA(10);
        test1.set_public("ccccc");


        Class classt = test1.getClass();

//        Method[] methods = classt.getMethods();
//        for (Method method : methods) {
//            Parameter[] parameters = method.getParameters();
//            System.out.println(method.getName());
//            for (Parameter parameter : parameters) {
//                System.out.println(parameter.getType() + " " + parameter.getName());
//            }
//            System.out.println("=====");
//        }


        Method[] methods = classt.getDeclaredMethods();
        for (Method method : methods) {
            Parameter[] parameters = method.getParameters();
            System.out.println(method.getName() + " " + method.getReturnType());
            for (Parameter parameter : parameters) {
                System.out.println(parameter.getType() + " " + parameter.getName());
            }
            System.out.println("=====");
        }
        Method mm = classt.getDeclaredMethod("haha", String.class);
        mm.setAccessible(true);
        mm.invoke(test1, "hahha");
    }
}
